import numpy as np
import matplotlib.pyplot as plt
import cv2
import glob
%matplotlib inline
images = glob.glob('camera_cal/calibration*.jpg')
plt.imshow(cv2.imread(images[0])[:,:,::-1]) # had problem with cv2.imshow
len(images)
# chessboard dimensions
cb_width = 9
cb_height = 6
objp = np.concatenate([np.mgrid[0:cb_width, 0:cb_height].T.reshape(-1,2), np.zeros((cb_width*cb_height,1))], axis=1)
objpoints = []
imgpoints = []
for f in images[:-3]:
img = cv2.imread(f)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (cb_width, cb_height), None)
if ret:
objpoints.append(objp.astype(np.float32)) # opencv breaks if it is the default float64
imgpoints.append(corners)
cv2.drawChessboardCorners(img, (cb_width, cb_height), corners, ret)
plt.figure()
plt.imshow(img)
plt.title(f + ' '.join(str(x) for x in img.shape))
else:
print('corner not found for', f)
img_size = (1280, 720)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, img_size,None,None)
import pickle
with open('distort_calibration.pickle','wb') as f:
pickle.dump({'dist':dist, 'mtx':mtx}, f)
for f in images[-3:]:
img = cv2.imread(f)
dst = cv2.undistort(img, mtx, dist, None, mtx)
plt.figure(figsize=(20,10))
plt.subplot(1,2,1)
plt.imshow(img[:,:,::-1])
plt.title('original')
plt.subplot(1,2,2)
plt.imshow(dst[:,:,::-1])
plt.title('undistorted')
dist